home *** CD-ROM | disk | FTP | other *** search
- /*
- DialogRoutines.c - routines which handle default buttons, filtering, etc
- */
-
- #include "DesktopSwitch.h"
- #include "DialogRoutines.h"
-
- void DrawDfltBorder(register DialogPtr dptr, short itemNo)
- {
- Rect itemBox;
- ControlHandle hItem;
- short dfltItemType, itemType;
- GrafPtr savedGptr;
-
- GetPort(&savedGptr);
- SetPort(dptr);
- GetDItem(dptr, ((DialogPeek)dptr)->aDefItem, &dfltItemType, (Handle *) &hItem, &itemBox);
- if (itemNo > 0)
- GetDItem(dptr, itemNo, &itemType, (Handle *) &hItem, &itemBox);
- else
- InsetRect(&itemBox, -4, -4);
-
- if (((WindowPeek)dptr)->hilited) {
- Boolean inColor;
- PenState pnState;
- RGBColor savedForeColor;
-
- GetPenState(&pnState);
- if (dfltItemType & itemDisable ||
- (dfltItemType & ctrlItem &&
- (**hItem).contrlHilite >= 254)) {
- long tmpPat[2];
- Pattern myGray;
-
- tmpPat[0] = tmpPat[1] = 0xAA55AA55;
- BlockMove((Ptr) tmpPat, (Ptr) &myGray, sizeof(Pattern));
- PenPat((ConstPatternParam)&myGray);
- }
-
- if (inColor = (dptr->portBits.rowBytes & 0xC000) != 0) {
- short i, ctSz;
- RGBColor ctlFrameColor;
- ColorSpec *pCSpec;
- AuxCtlHandle hACntl;
-
- GetAuxCtl(hItem, &hACntl);
- pCSpec = (*(*hACntl)->acCTable)->ctTable;
- ctlFrameColor = pCSpec->rgb; /* default color if part not found */
- for (i = 0, ctSz = (*(*hACntl)->acCTable)->ctSize;
- i <= ctSz; ++i, ++pCSpec)
- if (pCSpec->value == cFrameColor) {
- ctlFrameColor = pCSpec->rgb;
- break;
- }
- GetForeColor(&savedForeColor);
- RGBForeColor(&ctlFrameColor);
- }
- PenSize(3, 3);
- FrameRoundRect(&itemBox, 16, 16);
- if (inColor)
- RGBForeColor(&savedForeColor);
- SetPenState(&pnState);
- }
- SetPort(savedGptr);
- }
-
- void FlashBtn(ControlHandle hBtn, short partCode)
- {
- long garbage;
-
- HiliteControl(hBtn, partCode);
- Delay(8L, &garbage);
- HiliteControl(hBtn, 0);
- }
-
- Boolean StdModHitItem(DialogPtr dptr, short itemNo, Boolean flashIt,
- short *pItemHit)
- {
- Rect itemBox;
- Handle hItem;
- short itemType;
-
- GetDItem(dptr, itemNo, &itemType, &hItem, &itemBox);
- if (itemType & itemDisable)
- return(false);
- if (itemType & ctrlItem)
- if ((*(ControlHandle)hItem)->contrlHilite >= 254)
- return(false);
- else if (flashIt && !(itemType & resCtrl))
- FlashBtn((ControlHandle)hItem,
- (itemType & (chkCtrl + radCtrl)) ?
- inCheckBox : inButton);
- *pItemHit = itemNo;
- return(true);
- }
-
- short GetDCntlKey(DialogPtr dptr, Byte c)
- {
- Rect itemBox;
- Handle hItem;
- Str255 s;
- short i, n, itemHit, itemType;
- Byte myC[2];
-
- myC[0] = 1;
- myC[1] = c;
-
- UprString(myC, false);
- itemHit = 0;
- for (i = 1, n = **(short **)((DialogPeek)dptr)->items + 1; i <= n; i++) {
- GetDItem(dptr, i, &itemType, &hItem, &itemBox);
- if (itemType & ctrlItem) {
- GetCTitle((ControlHandle) hItem, s);
- if (LENGTH(s) && LowerCase(s[1]) == c)
- UprString(s, false);
- if (s[1] == myC[1]){
- if (itemHit)
- return(0);
- else
- itemHit = i;
- }
- }
- }
- return(itemHit);
- }
-
- /*-----------------------------------filterProc()-----------------------------------*/
-
- #define cancel 2
- #define dflt 1
-
- pascal Boolean StdFilterProc(DialogPtr dptr, EventRecord *pTheEvent, short *pItemHit)
- {
- if (pTheEvent->what == keyDown || pTheEvent->what == autoKey) {
- Byte c;
- short hit;
-
- c = (Byte) (pTheEvent->message & 0xff);
- if (c == 13 || c == 3)
- return(StdModHitItem(dptr, ((DialogPeek)dptr)->aDefItem, true, pItemHit));
- else if (c == '.' && (pTheEvent->modifiers & cmdKey))
- return(StdModHitItem(dptr, cancel, true, pItemHit));
- else if (c == 27 &&
- ((pTheEvent->message & keyCodeMask) == 0x00003500)) /* Hard-code ESC key */
- return(StdModHitItem(dptr, cancel, true, pItemHit));
- else if ((((DialogPeek)dptr)->editField == -1) &&
- (hit = GetDCntlKey(dptr, c)))
- return(StdModHitItem(dptr, hit, true, pItemHit));
- }
- else if ((pTheEvent->what == updateEvt) &&
- ((DialogPtr)pTheEvent->message == dptr)) {
- DrawDfltBorder(dptr, 0);
- }
- return(false);
- }
-
-